//
// Created by Linngdu664 on 2022/9/11.
//

#ifndef DATA_STRUCTURE_LIST1_H
#define DATA_STRUCTURE_LIST1_H

#include <iostream>

using namespace std;

class List1 {
private:
    int *value;
    int size;
    int length;
public:
    /**
     * 构造函数
     * @param len 表初始容量
     */
    List1(int len = 5) {
        value = (int *) malloc(sizeof(int) * len);
        length = len;
        size = 0;
    }

    /**
     * 添加一个元素
     * @param v 要插入元素
     * @return 自身
     */
    List1 *add(int v) {
        if (size >= length) {
            int *value2 = (int *) malloc(sizeof(int) * length * 2);
            memcpy(value2, value, length * sizeof(int));
            free(value);
            length = length * 2;
            value = value2;
        }
        for (int i = size;; i--) {
            if (value[i - 1] > v && i != 0) {
                value[i] = value[i - 1];
            } else {
                value[i] = v;
                break;
            }
        }
        size++;
        return this;
    }

    /**
     * 右移k位
     * @param k 右移位数
     */
    void displacement(int k) {
        while (k--) {
            for (int j = size - 1; j >= 1; j--) {
                swap(j, (j - 1));
            }
        }
    }

    /**
     * 表反转
     */
    void reversal() {
        for (int i = 0; i < size / 2; ++i) {
            swap(i, size - i - 1);
        }
    }

    /**
     * 交换a和b
     * @param a 元素下标
     * @param b 元素下标
     */
    void swap(int a, int b) {
        value[a] += value[b];
        value[b] = value[a] - value[b];
        value[a] -= value[b];
    }

    /**
     * 输出所有元素
     */
    void display() {
        for (int i = 0; i < size; i++) {
            cout << value[i] << " ";
        }
        cout << endl;
    }

    /**
     * 析构
     */
    virtual ~List1() {
        delete value;
    }
};

#endif //DATA_STRUCTURE_LIST1_H
